建议收藏|MySQL DBA 防坑指南
导读
本文由茹憶老师根据5月2日晚上的直播内容整理而成,我直接转载,以下是正文内容。
2022年5月2日,在上海面临抗疫关键时刻的五一黄金假期,特别邀请了Oracle MySQL ACE Director 叶金荣(叶老师),联合为大家带来了MySQL运维防坑的视频号在线直播,了解了这些坑可以让大家在日常运维更加平稳,全场300多人参与,直播持续了一个半小时,约1小时的分享和半小时的互动答疑,可谓干货满满。直播无回放,我们将直播涉及的关键内容进行了整理,形成了这份MySQL DBA防坑指南,建议大家可以收藏下来,类似问题参考解决(文末有下一场直播,欢迎预约)。
1. MySQL连接数问题
MySQL里的max_connections参数代表mysql数据库的最大连接数,参数默认是151,显然不适用于生产,如果请求大于默认连接数,就会出现无法连接数据库的错误,会遇到too many connections的报错信息。 Mysql5.5、mysql5.6、mysql5.7:默认的最大连接数都是151,上限为:100000 max_connections需要设置的一个合理的值,并需要做好监控,避免连接数满引发业务故障(生产环境建议5000-10000左右,没有固定的值,根据各自业务情况来定)。 另外如果数据库连接数过高,需要分析业务端是否存在大量刷MySQL连接的情况,比如大量的短连接,连接没有正常关闭,代码逻辑问题等。
2. MySQL文件句柄设置
在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。
在使用MySQL的过程中,有些用户碰到了打开文件句柄数过多的错误,查看用户实例的打开句柄个数,确实超过了系统设置的值,一旦出现了这种错误,将会带来连锁的各种错误(取决于当时正在操作什么类型的文件,以及什么操作)。
open_file_limits的设置的值,mysqld会通过setrlimit系统调用来初始化本进程可以使用的最大文件句柄数。
操作系统范围限制,可以通过编辑/etc/sysctl.conf或编辑指令fs.file-max来增加Linux中打开文件的限制。
3. 注意SQL隐式转换的坑
4. SQL为什么一会可以走到索引,一会走不到索引
5. 自增键重启后回溯问题
6. 自增键用完怎么办
7. 大表删除hang的问题
# du -sh pay_bills.ibd
175G pay_bills.ibd
# 创建硬链接
# ln pay_bills.ibd pay_bills.ibd_hdlk
mysql> drop table pay_bills;
Query OK, 0 rows affected (3.24 sec)
# yum install coreutils -y
#!/bin/bash
TRUNCATE=/usr/bin/truncate
for i in `seq 175 -2 1`; do
$TRUNCATE -s ${i}G pay_bills.ibd_hdlk
sleep 1
done
rm -f pay_bills.ibd_hdlk
8. Adaptive Hash Index引发的问题
9. MHA切换VIP的问题
10. pt-archiver迁移为什么少了一条数据
11. pt-osc和ghost变更丢数据的问题
CREATE TABLE`ddltest` (
`id` int(11)NOT NULL AUTO_INCREMENT,
`name`varchar(10) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
mysql>select * from ddltest;
+—-+——+
| id | name|
+—-+——+
| 1| a |
| 2| b |
+—-+——+
加字段设置not null没有default值:pt-osc执行报错(捕捉了warning,返回报错),gh-ost执行成功(因为会自动填充默认值),都不会丢数据。 加唯一索引:pt-osc和gh-ost都会执行成功,但是都会丢失重复值之后的所有数据。 加字段设置not null没有default值,同时加唯一索引:pt-osc执行失败不会丢数据,gh-ost执行成功会丢数据,表里只剩1条数据。 加字段设置not null并设置default值,同时加唯一索引:pt-osc和gh-ost都可以执行成功,都会丢数据,表里只剩1条数据。 加字段设置允许null值,加唯一索引不会丢数据,因为null不代表任何值,代表不重复的值,重复null值是可以加上唯一索引的。
使用pt-osc和gh-ost加唯一索引很危险,一定要确保加唯一索引的字段没有重复值,不然别执行,否则终有一天你就是删库跑路大神。 新增字段设置该字段为not null,同时该字段上加唯一索引,那也就等着死翘翘吧(not null不设置default值,使用pt-osc会捕捉到warning报错能免死一次,使用gh-ost的话直接丢数据,如果设置了default值,那不管是pt-osc还是gh-ost都会丢数据,直接死翘翘)。
完善SQL军规,新增字段时如果设置not null属性则必须带上default值。如果新增字段设置not null,禁止加唯一索引。 完善SQL审核流程,如果系统发现开发同学提交了新增唯一索引的SQL,则不允许开发自动执行,流转到DBA处理。 提高自我审核从严意识,同时在自动执行平台DBA审核界面,针对添加唯一索引,做强提醒功能。 针对加唯一索引的SQL,最好单独提交处理,走online ddl模式执行,尽量不用pt-osc和gh-ost。
12. 数据库拆分引发的删库事件
13.HA没有切换/监控没有正常报警
14. df看空间越来越少,du却没有发现大文件
lsof |awk '/deleted/{print $2}'|xargs kill -9
15. 死锁要紧么,需要注意什么
16. text等大对象类型有什么风险
text/blob大字段会引发页的分裂,影响性能,具体可以参考 浅析InnoDB Record Header及page overflow text字段会引起表占用更多的物理磁盘空间,不合理的text浪费大量磁盘空间
17. CPU %user 为什么特别的高
18. 查询被hang住了,什么原因
系统硬件问题 系统负载太高 MySQL连接/线程异常 InnoDB因素
系统负载高(CPU、IOWAIT、SWAP、中断)等。 DNS反解析问题 垃圾SQL太多 InnoDB线程排队 磁盘满了 有锁等待 redo、binlog 2PC、semi-sync delay、binlog group commit delay purge lag & checkpoint lag
19. mysql crash了,怎么办
分析error log, 判断是否因为触发bug而crash了 分析error log,判断是否因为innodb Semaphore wait太久而crash 判断是否因为数据页损坏而crash
通过google及官方站搜索bug库查找解决方案 分析日志,尽力还原现场,找出根因 修复数据页,导出数据重建 修复硬件故障和系统故障
五一劳动节的最后一场直播
本次为大家带来MySQL从5.6升级到8.0的流程和注意的坑
欢迎大家关注视频号,获取定期免费技术直播信息
《深入浅出MGR》视频课程
戳此小程序即可直达B站
https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0
文章推荐:
想看更多技术好文,点个“在看”吧!